package com.dji.sdk.mqtt.requests;

import com.dji.sdk.mqtt.CommonTopicRequest;

/**
 * MQTT请求消息类
 *
 * 该类扩展了通用请求基类(CommonTopicRequest)，专门用于处理requests类型的MQTT消息。
 * 在DJI Cloud API的MQTT通信架构中，requests类消息用于设备向云平台发送请求并期望得到响应的场景，
 * 如配置获取、License校验、组织绑定等关键业务流程。
 *
 * 主要特点和作用：
 * 1. 继承了CommonTopicRequest的基础消息属性(tid、bid、timestamp、data)
 * 2. 添加了method字段标识具体的请求方法
 * 3. 添加了gateway字段标识请求来源的设备网关序列号
 * 4. 通常与TopicRequestsResponse配对使用，形成完整的请求-响应模式
 *
 * 在MQTT通信中，该类的消息通常发布到如下主题：
 * thing/product/{gateway_sn}/requests
 *
 * @author sean
 * @version 1.7
 * @date 2023/5/24
 */
public class TopicRequestsRequest<T> extends CommonTopicRequest<T> {

    /**
     * 请求方法
     * 标识具体的请求类型或操作，云平台根据此字段确定如何处理请求。
     * 常见值包括：
     * - config: 获取配置信息，用于License校验
     * - airport_bind_status: 获取机场绑定状态
     * - storage_config_get: 获取存储配置
     * 等多种方法，每种方法对应不同的业务处理逻辑和数据结构。
     */
    private String method;

    /**
     * 网关序列号
     * 标识请求来源的设备，通常是飞行器、机场等设备的序列号。
     * 云平台通过此字段识别请求的设备身份，并在必要时进行权限验证。
     */
    private String gateway;

    public TopicRequestsRequest() {
    }

    @Override
    public String toString() {
        return "TopicRequestsRequest{" +
                "method='" + method + '\'' +
                ", gateway='" + gateway + '\'' +
                ", tid='" + tid + '\'' +
                ", bid='" + bid + '\'' +
                ", timestamp=" + timestamp +
                ", data=" + data +
                '}';
    }

    public String getTid() {
        return tid;
    }

    public TopicRequestsRequest<T> setTid(String tid) {
        this.tid = tid;
        return this;
    }

    public String getBid() {
        return bid;
    }

    public TopicRequestsRequest<T> setBid(String bid) {
        this.bid = bid;
        return this;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public TopicRequestsRequest<T> setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
        return this;
    }

    public T getData() {
        return data;
    }

    public TopicRequestsRequest<T> setData(T data) {
        this.data = data;
        return this;
    }

    public String getGateway() {
        return gateway;
    }

    public TopicRequestsRequest<T> setGateway(String gateway) {
        this.gateway = gateway;
        return this;
    }

    public String getMethod() {
        return method;
    }

    public TopicRequestsRequest<T> setMethod(String method) {
        this.method = method;
        return this;
    }
}